跳到主要内容

搭建 Gogs 代码托管

使用 Docker 搭建 Gogs

# docker-compose.yml
version: '3.8'

services:
gogs:
image: gogs/gogs:latest
container_name: gogs
restart: always
volumes:
- ./data:/data
ports:
- "52127:3000"
- "52122:22"
deploy:
resources:
limits:
cpus: '1' # 设置CPU核数限制,这里设置为1核
memory: 512M # 设置内存限制,这里设置为512MB
networks:
- gogs-network

networks:
gogs-network:
driver: bridge

这里的 22 端口是用于允许用户通过 SSH 协议与 Gogs 交互。

这个配置文件定义了一个服务 gogs,使用了官方的 Gogs 镜像,并且映射了 22 和 3000 端口,分别用于 SSH 和 Web 访问。数据将被存储在 gogs-data 卷中。

docker-compose up -d

配置域名路由

# gogs-ingressroute.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: gogs-wildcard-cert
namespace: common-namespace
spec:
secretName: gogs-cert-secret
dnsNames:
- "gogs.quicktoolset.top"
issuerRef:
name: internal-ca-issuer
kind: ClusterIssuer
---

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: gogs-ingressroute
namespace: common-namespace
spec:
entryPoints:
- websecure
routes:
- match: Host(`gogs.quicktoolset.top`) && PathPrefix(`/`)
kind: Rule
services:
- name: gogs-external-service
port: 8080
tls:
secretName: gogs-cert-secret
domains:
- main: "gogs.quicktoolset.top"

---
apiVersion: v1
kind: Endpoints
metadata:
name: gogs-external-service
namespace: common-namespace
subsets:
- addresses:
- ip: 10.200.0.1
ports:
- port: 52127

---
apiVersion: v1
kind: Service
metadata:
name: gogs-external-service
namespace: common-namespace
spec:
ports:
- protocol: TCP
port: 8080
targetPort: 52127
kubectl apply -f gogs-ingressroute.yaml

Docker 启动方式配置 SSH

配置 Gogs 使用 SSH 需要一些额外的步骤,因为你需要确保 SSH 服务在 Docker 容器内运行,并且对外界可用。

以下是一个基本的步骤来配置 Gogs Docker 容器以支持 SSH:

1、获取 Gogs Docker 镜像:

你可以从 Docker Hub 上拉取 Gogs 镜像:

docker pull gogs/gogs

2、创建 Docker 容器并映射 SSH 端口:

当你运行 Gogs 容器时,你需要将 SSH 端口(默认为 22)映射到宿主机的一个端口上。因为端口 22 很可能已经被宿主机上的 SSH 服务占用,你可以映射到另一个端口,例如 2222:

docker run --name=gogs -p 10022:22 -p 10080:3000 -d gogs/gogs

在这个例子中,宿主机的 10022 端口映射到了容器的 22 端口(SSH),宿主机的 10080 端口映射到了容器的 3000 端口(Gogs web 服务)。

3、配置 SSH:

为了使 SSH 正常工作,你需要在 Gogs 容器内配置 SSH。这通常涉及到编辑容器内的 /etc/ssh/sshd_config 文件,确保 SSH 服务使用非标准端口,如果你使用了上面的端口映射,那么你应该不需要改变容器内的 SSH 端口配置。

如果你需要进入容器内部来修改配置,你可以使用:

docker exec -it gogs /bin/bash

然后编辑 SSH 配置文件,通常是 /etc/ssh/sshd_config

4、生成 SSH 密钥:

Gogs 容器内的 SSH 服务需要有自己的密钥。你可以在容器内使用 ssh-keygen 生成它们,或者在创建容器时挂载一个包含 SSH 密钥的卷。

5、重启 SSH 服务:

配置完毕后,你需要重启 SSH 服务以应用更改。在容器内部,你可以运行:

service ssh restart

或者你可以重启整个容器:

docker restart gogs

6、更新 Gogs 应用配置:

你需要更新 Gogs 的应用配置,以确保它知道 SSH 端口已更改。这通常是在 Gogs 的配置文件 app.ini 中完成的。

[server]
SSH_PORT = 22 # 这里应该保持为22,因为这是容器内的端口
DOMAIN = your.domain.com
ROOT_URL = http://your.domain.com:10080/

如果你修改了容器内的配置文件,确保你的更改不会在容器重启时丢失。你可能需要将配置文件放在一个持久化的卷中。

7、在客户端配置 SSH:

客户端需要知道连接到 Gogs 服务器的 SSH 端口不是默认的 22。在客户端的 ~/.ssh/config 文件中添加以下配置:

Host your.domain.com
HostName your.domain.com
Port 10022
User git

确保替换 your.domain.com 为你的域名或宿主机的 IP 地址。

config 文件是用来配置经常访问的主机连接信息(如 IP 地址、用户名、私钥)。使用 config 文件的好处是,平时我们使用 ssh 连接远程主机时通常使用下面两种命令:

使用 config 文件的好处是,平时我们使用 ssh 连接远程主机时通常使用下面两种命令:

密码形式

ssh git@10.0.0.10 -p 10022 # 回车后会提示输入密码

密钥文件形式

ssh -i ~/.ssh/gogs git@10.0.010 -p 10022

上面的命令每次输入,就会变得繁琐,然而配置 config 文件后,命令就可以简化为:

Host gogs
Hostname 10.0.0.10
User git
Port 10022
IdentityFile ~/.ssh/gogs
IdentitiesOnly yes
ssh gogs

具体参考文档:https://www.vkarz.com/index.php/archives/27/

配置一个自动部署脚本

创建一个脚本 deploy-gogs.sh

#!/bin/bash

# 配置参数
DATA_PATH="./gogs_data"
SSH_PATH="./gogs_ssh"
SSH_KEY="$SSH_PATH/ssh_host_rsa_key"
SSH_CONFIG="$SSH_PATH/sshd_config"
DOCKER_COMPOSE_FILE="./docker-compose.yml"

# 创建必要的目录
mkdir -p "$DATA_PATH"
mkdir -p "$SSH_PATH"

# 创建 docker-compose.yml 文件
cat > "$DOCKER_COMPOSE_FILE" <<EOF
version: '3.8'

services:
gogs:
image: gogs/gogs:latest
container_name: gogs
restart: always
volumes:
- $DATA_PATH:/data
- $SSH_PATH:/etc/ssh
ports:
- "52127:3000"
- "52122:22"
environment:
- SSH_PORT=22
networks:
- gogs-network

networks:
gogs-network:
driver: bridge
EOF

# 检查是否已存在 SSH 密钥,如果没有则生成
if [ ! -f "$SSH_KEY" ]; then
ssh-keygen -t rsa -b 4096 -f "$SSH_KEY" -N ""
echo "SSH key generated at $SSH_KEY"
else
echo "SSH key already exists at $SSH_KEY"
fi

# 创建 SSH 配置文件
cat > "$SSH_CONFIG" <<EOF
Port 22
PermitRootLogin no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /data/git/.ssh/authorized_keys
EOF

echo "SSH configuration set at $SSH_CONFIG"

# 启动 Gogs 服务
echo "Starting Gogs service..."
docker-compose -f "$DOCKER_COMPOSE_FILE" up -d

Reference